#include "Sql_list.h"
// 初始化
Link_list *init_link_list(void)
{
    Link_list *L = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == L)
    {
        printf("创建失败！\n");
        return NULL;
    }
    L->next = NULL;
    return L;
}
// 尾插
void tail_insert_node(Link_list *list, Elenemt_data data)
{ // 创建节点
    Node *L = (Node *)malloc(sizeof(Node));
    // 传数据
    L->data = data;
    // 创建指向
    Node *ptr = list->next;
    // 如果list数据为0
    if (ptr == NULL)
    {
        L->next = list->next;
        list->next = L;
        return;
    }
    // 循环
    for (; ptr->next != NULL;)
    {
        ptr = ptr->next;
    }
    L->next = ptr->next;
    ptr->next = L;
    return;
}
// 中间插
void insert_node(Link_list *list, Elenemt_data data, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    // 创建节点
    Node *L = (Node *)malloc(sizeof(Node));
    // 传数据
    L->data = data;
    // 创建指向
    Node *ptr = list->next;
    if (pos == 1)
    {
        L->next = list->next;
        list->next = L;
        return;
    }

    // 循环
    for (int i = 1; i < pos - 1; i++)
    {
        ptr = ptr->next;
    }
    L->next = ptr->next;
    ptr->next = L;
    return;
}
// 中间删
void delete_node(Link_list *list, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    Node *ptr_1 = list->next;
    Node *ptr_2 = NULL;
    if (pos == 1)
    {
        list->next = ptr_1->next;
        return;
    }
    for (int i = 1; i < pos - 1; i++)
    {
        ptr_1 = ptr_1->next;
    }
    ptr_2 = ptr_1->next;
    ptr_1->next = ptr_2->next;
}
// 位置查数据
Node *find_node_id(Link_list *list, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return NULL;
    }
    if (NULL == list->next)
    {
        printf("list的数据为NULL\n");
        return NULL;
    }
    Node *ptr = list->next;
    for (int i = 1; i < pos; i++)
    {
        ptr = ptr->next;
    }
    printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
           ptr->data.name, ptr->data.sex, ptr->data.age,
           ptr->data.sco, ptr->data.id);
    return ptr;
}
// 名字查数据
Node *find_node_name(Link_list *list, char *name)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return NULL;
    }
    if (NULL == list->next)
    {
        printf("list的数据为NULL\n");
        return NULL;
    }
    Node *ptr = list->next;
    for (int i = 1; NULL != ptr->next; i++)
    {
        if (!strcmp(ptr->data.name, name))
        {
            printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
                   ptr->data.name, ptr->data.sex, ptr->data.age,
                   ptr->data.sco, ptr->data.id);
            return ptr;
        }
        ptr = ptr->next;
    }
}
//合并
Link_list* merge_link_lists(Link_list* list1, Link_list* list2)
{
    if (NULL == list1 || NULL == list2 )
    {
        printf("list为NULL\n");
        return NULL;
    }
        if (NULL == list1->next && NULL == list2->next )
    {
        printf("list.next为NULL\n");
        return NULL;
    }
    Link_list * L = init_link_list();
    Node * ptr1 = list1->next;
    Node * ptr2 = list2->next;
    int i = 1;
    for (; ptr1 != NULL; i++)
    {
        tail_insert_node(L, ptr1->data);
        ptr1 = ptr1->next;
    }
        for (; ptr2 != NULL; i++)
    {
        tail_insert_node(L, ptr2->data);
        ptr2 = ptr2->next;
    }
    return   L;
}
// 清空(有问题)
void clear_link_list(Link_list* list)
{
if (NULL == list)
    {
        printf("list为NULL\n");
        return ;
    }
    if (NULL == list->next)
    {
        printf("list.next为NULL\n");
        return ;
    }
    Node * ptr_1 = list->next;
    Node * ptr_2 = ptr_1->next;
    for (int i = 0; NULL != ptr_2; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        ptr_2 = ptr_2->next;
    }
    list->next = NULL;
    // printf("a\n");
    return;
    
}
//  遍历
void print_link_list(Link_list *list)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("表内无数据\n");
        return;
    }
    
    Node *L = list->next;
    for (size_t i = 0; L != NULL; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
               L->data.name, L->data.sex, L->data.age,
               L->data.sco, L->data.id);
        L = L->next;
    }

    // for (int i = 0; i<3; i++)
    // {L = list->next;
    //     printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
    //            L->next->data.name, L->next->data.sex, L->next->data.age,
    //            L->next->data.sco, L->next->data.id);
}
// 销毁
void free_link_list(Link_list **list)
{
    if (NULL == *list)
    {
        printf("数据为NULL\n");
        return;
    }
        if (NULL == (*list)->next)
    {
        printf("表内无数据,已销毁头节点\n");
        free(*list);
        *list = NULL;
        return;
    }
    Node *L1 = (*list)->next;
    Node *L2 = L1->next;
    for (int i = 0; NULL != L2; i++)
    {
        free(L1);
        L1 = NULL;
        L1 = L2;
        L2 = L2->next;

    }
    free(*list);
    *list = NULL;
}